/**
 * Copyright (c) 2007, Nathan A. Good
 *
 *	All rights reserved.
 *
 *	Redistribution and use in source and binary forms, with or without 
 *	modification, are permitted provided that the following conditions are met:
 *
 *	-	Redistributions of source code must retain the above copyright notice, 
 *		this list of conditions and the following disclaimer.
 *
 *	-	Redistributions in binary form must reproduce the above copyright 
 *		notice, this list of conditions and the following disclaimer in the 
 *		documentation and/or other materials provided with the distribution.
 *
 *	-	Neither the name of the Crown Financial Ministries nor the names of 
 *		its contributors may be used to endorse or promote products derived
 *		from this software without specific prior written permission.
 *
 *	THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 *	AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
 *	IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
 *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
 *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
 *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
 *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
 *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 
 *  THE POSSIBILITY OF SUCH DAMAGE.
 */
package org.crown.kings.jsf;

import javax.el.ELResolver;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * Base bean for backing JSF pages.
 * 
 * @author nathan.a.good@gmail.com
 * @version $Id$
 */
public class BaseBean
{
	public static final String FAILURE = "failure";

	public static final String FINISH = "finish";
	private static final Log logger = LogFactory.getLog(BaseBean.class);
	public static final String NEXT = "next";
	public static final String PREVIOUS = "previous";
	public static final String SUCCESS = "success";

	private int id;

	/**
	 * Adds a message to the current faces context with the given severity.
	 * 
	 * @param severity
	 *          FacesMessage.Severity to use.
	 * @param message
	 *          The String message to add to the faces context.
	 * @see FacesContext
	 * @see FacesMessage
	 */
	public void addMessage(final FacesMessage.Severity severity, final String message)
	{
		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(severity, message, null));
	}

	/**
	 * Adds a message to the faces context with the default severity of
	 * FacesMessage.SEVERITY_INFO
	 * 
	 * @see #addMessage(javax.faces.application.FacesMessage.Severity, String)
	 * 
	 * @param message
	 */
	public void addMessage(final String message)
	{
		addMessage(FacesMessage.SEVERITY_INFO, message);
	}

	/**
	 * 
	 * @return
	 */
	public String doFinish()
	{
		return FINISH;
	}

	/**
	 * 
	 * @return
	 */
	public String doNext()
	{
		return NEXT;
	}

	public int getId()
	{
		return id;
	}

	public PersonWipBean getPersonWip()
	{
		PersonWipBean wip = (PersonWipBean) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(
				"personWip");

		if (wip == null) {
			logger.warn("PersonWipBean was null.  Creating...");
			final FacesContext fcontext = FacesContext.getCurrentInstance();
			final ELResolver resolver = fcontext.getApplication().getELResolver();
			wip = (PersonWipBean) resolver.getValue(fcontext.getELContext(), null, "personWip");
		}
		return wip;
	}

	public UserBean getUser()
	{
		return new UserBean("nagood");
	}

	public void handle(final Throwable t)
	{
		handle(t, "An error has occured.");
	}

	public void handle(final Throwable t, final String message)
	{
		final FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, message, t.getMessage());
		FacesContext.getCurrentInstance().addMessage(null, msg);
		LogFactory.getLog(this.getClass()).error(message, t);
	}

	public void setId(final int id)
	{
		this.id = id;
	}

}
